#include "u8g2_oled_driver.h"
u8g2_t u8g2;
/***********************初始化函数实现****************************/
//注册新的初始化函数步骤请参考库使用手册
//硬件spi
void user_u8g2_setup_sh1106_spi_hw(u8g2_t *u8g2)
{u8g2_Setup_sh1106_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_4wire_hw_spi, u8x8_stm32_gpio_and_delay_hw_spi);}




                                                                                                                                                                                                                                                                                                                         
/***********************初始化函数实现****************************/


/************************底层协议函数实现*****************************/

//硬件SPI
/**
 * @brief 硬件spi消息发送函数
 * @param u8x8 
 * @param msg 
 * @param arg_int 
 * @param arg_ptr 
 * @return uint8_t 
 */
uint8_t u8x8_byte_4wire_hw_spi(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
    switch (msg)
    {
    case U8X8_MSG_BYTE_SEND: /*通过SPI发送arg_int个字节数据*/
        //DMA传输模式
        //HAL_SPI_Transmit_DMA(SPI_HW_HANDLE, (uint8_t *)arg_ptr, arg_int);  
		//while(*SPI_HW_HANDLE.TxXferCount);
        //硬件SPI传输模式
        HAL_SPI_Transmit(SPI_HW_HANDLE, (uint8_t *)arg_ptr, arg_int, 200);
        break;
    case U8X8_MSG_BYTE_INIT: /*初始化函数*/
        break;
    case U8X8_MSG_BYTE_SET_DC: /*设置DC引脚,表明发送的是数据还是命令*/
			HAL_GPIO_WritePin(SPI_HW_DC_GPIO_Port, SPI_HW_DC_Pin, (GPIO_PinState)arg_int);
		break;
    case U8X8_MSG_BYTE_START_TRANSFER:	//开始发送
			u8x8_gpio_SetCS(u8x8, u8x8->display_info->chip_enable_level);
			u8x8->gpio_and_delay_cb(u8x8, U8X8_MSG_DELAY_NANO, u8x8->display_info->post_chip_enable_wait_ns, NULL);

        break;
    case U8X8_MSG_BYTE_END_TRANSFER: //结束发送
			u8x8->gpio_and_delay_cb(u8x8, U8X8_MSG_DELAY_NANO, u8x8->display_info->pre_chip_disable_wait_ns, NULL);
			u8x8_gpio_SetCS(u8x8, u8x8->display_info->chip_disable_level);	
        break;
    default:
        return 0;
    }
    return 1;
}
/**
 * @brief  GPIO和延时控制函数
 * @param u8x8 
 * @param msg 
 * @param arg_int 
 * @param arg_ptr 
 * @return uint8_t 
 */
uint8_t u8x8_stm32_gpio_and_delay_hw_spi(U8X8_UNUSED u8x8_t *u8x8, U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int, U8X8_UNUSED void *arg_ptr)
{
    switch (msg)
    {
    case U8X8_MSG_GPIO_AND_DELAY_INIT: /*delay和GPIO的初始化，在main中已经初始化完成了*/
        break;
    case U8X8_MSG_DELAY_MILLI: /*延时函数*/
        HAL_Delay(arg_int);
        break;
    case U8X8_MSG_GPIO_CS: /*片选信号*/
		 HAL_GPIO_WritePin(SPI_HW_CS_GPIO_Port, SPI_HW_CS_Pin, (GPIO_PinState)arg_int);	
        break;
    case U8X8_MSG_GPIO_DC:
        break;
    case U8X8_MSG_GPIO_RESET:
        break;
    }
    return 1;
}
